<?php

namespace Visitors;

use NotificationDelivery\Queue;
use Pinenut\Model2\Embedded\ReferenceContainer\One;
use Pinenut\Model2\Embedded\Reference;

use Users\Profile;
use NotificationDelivery\Delivery\PushStream;
use EmailDelivery\LastSentRegistry;
use NotificationDelivery\Delivery\PushStreamState;
use EmailDelivery\EmailDelivery;

class Visits extends \Model { // Visitors
	public $visitor;
	public $owner;
	public $visiteTime;

	static function fields() {
		return array_merge ( parent::fields (), [ 
				'visitor' => [ 
						One::className (),
						Reference::className (),
						Profile::className(),
				],
				'owner' => [ 
						One::className (),
						Reference::className (),
						Profile::className(),
				]
				,
				'visiteTime' => self::DATE 
		] );
	}
	// add visitor to base
	public static function addVisitor($visitorId, $ownerId) {
		
		// visits himself
		if ($visitorId == $ownerId)
			return;
		
		$profile = Profile::find ( $ownerId );
		
		// if not exists creat
		if (VisitsInfo::find ()->where ( 'profile._ref', ( string ) $profile->_id )->count () == 0) {
			VisitsInfo::createVisit ( ( string ) $profile->_id );
		}
		
		$doNotification = false;
		
		$proVisite = VisitsInfo::find ()->where ( 'profile._ref', ( string ) $profile->_id )->one ();
		
		if (static::find ()->where ( 'visitor._ref', ( string ) $visitorId )->where ( 'owner._ref', ( string ) $ownerId )->count () == 0) {
			
			$object = new static ();
			$object->visitor [( string ) $visitorId];
			$object->owner [( string ) $ownerId];
			$object->visiteTime = time ();
			$object->save ();
			
			$proVisite->profileVisitorsByDay ++;
			$proVisite->profileVisitorsByWeek ++;
			$proVisite->profileVisitorsByMonth ++;
			$proVisite->unSeenCount ++;
			$proVisite->save ();
			
			$doNotification = true;
			
		} else {
			$object = static::find ()
				->where ( 'visitor._ref', ( string ) $visitorId )
				->where ( 'owner._ref', ( string ) $ownerId )->one ();
			
			if ($object->visiteTime < time () - 86400)
				$proVisite->profileVisitorsByDay ++;
			
			if ($object->visiteTime < time () - 86400 * 7)
				$proVisite->profileVisitorsByWeek ++;
			
			if ($object->visiteTime < time () - 86400 * 30)
				$proVisite->profileVisitorsByMonth ++;
			
			// если последний заход пользователя был ранее времени просмотра 
			// своих посетителей пользователей, то делаем +1 к новым посещениям
			if ($object->visiteTime < $proVisite->lastViewOwner) {
				$proVisite->unSeenCount ++;
				$doNotification = true;
			}
			
			if (is_object ( $proVisite ))
				$proVisite->save ();
			
			$object->visiteTime = time ();
			$object->save ();
		};
	
		if ($doNotification) {
			Queue::enqueue ( [
					'type' => \NotificationDeliveryConfig::TYPE_SEND_TO_RECEIVER,
					'subscriber' => (string)$ownerId,
					'data' => [ 
							'eventName' => 'changeVisitorsCount',
							'eventData' => 'awesome' 
					] 
			] );
			
			// Нахер выпилить отсюда... Но потом (:
			
			// Проверяем, включены ли у пользователя уведомления о сообщениях в настройках уведомлений
			// Проверяем статус пользователя на оффлайн
			// Проверяем, не отсылалось ли пользователю письмо по этому событию от этого визитора
			// Если все условия подходят - шлем уведомление на мыло
			$delivery = new PushStream((string)$profile->_id);
			$userOnlineLastActivity = $delivery->getOnlineLastActivity();
			
			$LastSentRegistry = LastSentRegistry::check('visitor', (string)$visitorId .'.'. (string)$profile->_id);
			
			if ($profile->notifyNewVisitor
				&& $delivery->state() === PushStreamState::OFFLINE
				&& ($userOnlineLastActivity > $LastSentRegistry))
			{
				EmailDelivery::sendTemplate(\EmailDeliveryConfig::TEMPLATE_TYPE_EMAIL_VISITOR, [
					'email' => $profile->email,
					'userId' => (string)$profile->_id,
					'visitorId' => (string)$visitorId
				]
				);
					
				LastSentRegistry::mark('visitor', (string)$visitorId .'.'. (string)$profile->_id);
			}
		}
	}
}